package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"time"
)

// API请求结构体
type (
	ChatRequest struct {
		Model    string    `json:"model"`
		Messages []Message `json:"messages"`
	}

	Message struct {
		Role    string      `json:"role"`
		Content interface{} `json:"content"`
	}

	ContentItem struct {
		Type     string    `json:"type"`
		ImageURL *ImageURL `json:"image_url,omitempty"`
		Text     string    `json:"text,omitempty"`
	}

	ImageURL struct {
		URL string `json:"url"`
	}
)

const (
	apiEndpoint = "http://172.16.168.58/v1/chat/completions"
	modelPath   = "Qwen/Qwen2.5-VL-7B-Instruct"
)

// 新增响应解析结构体
type (
	APIResponse struct {
		ID      string    `json:"id"`
		Model   string    `json:"model"`
		Choices []Choice  `json:"choices"`
		Usage   UsageInfo `json:"usage"`
	}

	Choice struct {
		Message struct {
			Content string `json:"content"`
		} `json:"message"`
		FinishReason string `json:"finish_reason"`
	}

	UsageInfo struct {
		PromptTokens     int `json:"prompt_tokens"`
		CompletionTokens int `json:"completion_tokens"`
		TotalTokens      int `json:"total_tokens"`
	}
)

// QueryImage 图像分析函数
// 参数：
//
//	imageURL: 图片访问地址
//	queryText: 需要分析的文本描述
//
// 返回：
//
//	string: API响应内容
//	error: 错误信息
func QueryImage(imageURL, queryText string) (string, *UsageInfo, error) {
	// 构造请求体
	reqBody := ChatRequest{
		Model: modelPath,
		Messages: []Message{
			createSystemMessage(),
			createUserMessage(imageURL, queryText),
		},
	}

	// 序列化请求
	jsonData, err := json.Marshal(reqBody)
	if err != nil {
		return "", nil, fmt.Errorf("JSON序列化失败: %w", err)
	}

	// 发送请求
	resp, err := http.Post(apiEndpoint, "application/json", bytes.NewBuffer(jsonData))
	if err != nil {
		return "", nil, fmt.Errorf("API请求失败: %w", err)
	}
	defer resp.Body.Close()

	// 读取响应
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return "", nil, fmt.Errorf("读取响应失败: %w", err)
	}

	// 检查HTTP状态码
	if resp.StatusCode != http.StatusOK {
		return "", nil, fmt.Errorf("API返回异常状态码: %d\n响应内容: %s",
			resp.StatusCode, string(body))
	}

	// 新增响应解析
	var apiResp APIResponse
	if err := json.Unmarshal(body, &apiResp); err != nil {
		return "", nil, fmt.Errorf("响应解析失败: %w\n原始响应: %s", err, string(body))
	}

	// 检查有效响应
	if len(apiResp.Choices) == 0 {
		return "", nil, fmt.Errorf("API返回空choices数组")
	}

	return apiResp.Choices[0].Message.Content, &apiResp.Usage, nil

}

// createSystemMessage 创建系统消息
func createSystemMessage() Message {
	return Message{
		Role:    "system",
		Content: "You are a helpful assistant.",
	}
}

// createUserMessage 创建用户消息
func createUserMessage(imageURL, queryText string) Message {
	return Message{
		Role: "user",
		Content: []ContentItem{
			{
				Type: "image_url",
				ImageURL: &ImageURL{
					URL: imageURL,
				},
			},
			{
				Type: "text",
				Text: queryText,
			},
		},
	}
}

// 响应数据结构体
type AnalysisResponse struct {
	Content      string     `json:"content"`
	Usage        TokenUsage `json:"usage"`
	TotalElapsed int64      `json:"total_elapsed_ms"` // 毫秒单位
}

type TokenUsage struct {
	PromptTokens     int `json:"prompt_tokens"`
	CompletionTokens int `json:"completion_tokens"`
	TotalTokens      int `json:"total_tokens"`
}

func webtestools(imageURL string)(err error,data string ) {
	// 示例用法
	queryText := "描述这张图片的内容，如果有人类，描述人类的动作、肤色、民族、神情、衣着等要素"

	start := time.Now()
	content, usage, err := QueryImage(imageURL, queryText)
	if err != nil {
		fmt.Printf("请求失败: %v\n", err)
		return err,""
	}
	totalElapsed := time.Since(start) // 包含函数外部的耗时（可选）
	//fmt.Println("图片分析结果:")
	//fmt.Println(content)
	//fmt.Printf("\nToken使用情况: 输入%d / 输出%d / 总计%d\n",
	//	usage.PromptTokens, usage.CompletionTokens, usage.TotalTokens)
	// fmt.Printf("总耗时: %v (包含外部处理)\n", totalElapsed.Round(time.Millisecond))
	content  =  content
	usage1 := TokenUsage{
		PromptTokens:     usage.PromptTokens,
		CompletionTokens: usage.CompletionTokens,
		TotalTokens:      usage.TotalTokens,
	}
	totalElapsed = totalElapsed.Round(time.Millisecond)

	// 构建响应结构
	response := AnalysisResponse{
		Content:      content,
		Usage:        usage1,
		TotalElapsed: totalElapsed.Round(time.Millisecond).Milliseconds(),
	}

	// 生成JSON
	jsonData, err := json.MarshalIndent(response, "", "  ")
	if err != nil {
		fmt.Printf("JSON生成失败: %v", err)
		return err,""
	}

	//fmt.Println("生成的JSON结构:")
	// fmt.Println(string(jsonData))
        return   nil ,string(jsonData)

}

func main () {
	err,data :=   webtestools("http://fileserver/dog_and_girl.jpeg")
	if err != nil {
        }else{
          fmt.Println(data)
	}


}
